<!-- 模型 -->
<?php
namespace app\common\model\User;
use think\Model;
class User extends Model
{
    // 设置数据表 => 用户表
    protected $table = 'pre_user';
    
    // 追加字段
    protected $appnd = [
        'sex_text'
    ];
    //时间函数
   // 自动写入时间 
   protected $autoWriteTimestamp = true;
   // 创建时间 => 注册时间
   protected $createTime = 'createtime';
   // 更新时间
   protected $updateTime = false;

    // 设置不存在的字段
    public function getSexTextAttr($value,$data)
    {
        $SexList = [0 => '保密', 1 => '男', 2 => '女'];

        return $SexList[$data['sex']];
    }
}
?>

<!-- 渲染 -->
<?php
namespace app\home\controller;
// 引用DB类
use think\Db;
// 引用tp的基础控制器
use think\Controller;
class Index extends Controller//继承公共控制器，
{
    //__construct会在函数创建时就调用
    public function __construct()
    {
        // 手动继承父级 即Index类，
        // Inedx类继承了公共控制器，所以该方法会传递给所有控制器
        parent::__construct();
        // 将模型里面的数据库数据给到$this->UserModel
        // 在__construct()方法内，$this->UserModel所有控制器都能用到
        $this->UserModel = model('User.User');
    }
    // 登录
    public function login()
    {
        // 如果存在post请求的表单数据则进入语句
        if($this->request->isPost())
        {//获取所有请求的数据并转成数组
            $params = $this->request->param();
            // 如果验证失败
            if(!captcha_check($params['vercode']))
            {
                $this->error('验证码错误');
            }

            // 查询存在邮箱值的一条数据
            $User = $this->UserModel->where(['email' => $params['email']])->find();

            // 查询出来的结果为空 说明该用户不存在
            if(!$User)
            {
                $this->error('该用户不存在');
            }
            // 一起加密登录密码和密码盐
            $password = md5($params['pass'].$User['salt']);
            // 如果和数据库里面的一起加密登录密码和密码盐不一样
            if($password != $User['password'])
            {
                $this->error('密码错误');
            }

            // 设置cookie 本地储存，储存用户信息
            $data = [
                // 获取数据库里面的用户登录输入的邮箱那一条的字段值
                'id' => $User['id'],
                'email' => $User['email'],
                'nickname' => $User['nickname'],
                'vip' => $User['vip'],
                'auth' => $User['auth'],
                // sex_text为模板中新添加的字段，会改变原来字段值与其相对应的值
                'sex' => $User['sex_text'],
                'point' => $User['point'],
                // 如果库中不存在头像则返回默认头像
                'avatar' => $User['avatar'] ? $User['avatar'] : '/static/home/res/images/avatar/default.png',
                // 如果库中不存在背景则返回默认背景
                'cover' => $User['cover'] ? $User['cover'] : '/static/home/res/images/back_1.jpg',
            ];
            //  创建一个LoginUser作为cookie属性 将$data中所有的值赋值給loginUser
            cookie('LoginUser',$data);
            // 能走到这里就说明登录成功了
            $this->success('登录成功',url('home/user/index'));
        }
    // fetch()如果不赋值则默认赋值为当前方法名作为第一个参数,
    // 即相当于fetch('login')，将方法渲染給view中的login.html
        return $this->fetch();
    }
    // 注册
    public function register()
    {
    // 判断这是否post请求
    if($this->request->isPost())
    {
        // get post 接收表单的全部参数
        $params = $this->request->param();
        // halt($params);  会输出改$params的数据并终止操作
        // 验证验证码 将表单里面带有name为vercode的input的value值 用captcha_check方法验证$params['vercode']是否一致
        if(!captcha_check($params['vercode']))
        {
            // 默认跳转回中间页
            $this->error('验证码错误');
        }
        // 判断密码和确认密码是否一致
        if($params['pass'] != $params['repass'])
        {
            $this->error('密码与确认密码不一致');
        }   
        // 调用密码盐函数
        $salt = build_ranstr();
        // 对密码盐和密码一起加密
        $password = md5($params['pass'].$salt); 
        // 也可以用Db类或者模型增删改查 用Db类查询注册的赠送积分 具体查看手册 返回表单的两个字段中的value值
        $point = Db::table('tableName')->where('key','RegisterPoint')->value('value');  
        // 封装插入数据库的数组--
        $data = [
            'email' => $params['email'],
            'nickname' => $params['nickname'],
            'password' => $password,
            'salt' => $salt,
            'sex' => 0,
            'auth' => 0,
            'vip' => 1,
            'point' => $point
        ];  
        // validate()返回布尔值, 将UserModel放到common/User/User验证器里面验证，如果验证成功则继续执行后面的语句
        // save($data) 将$data的值保存到UserModel并实例化 所有的控制器都可以获取UserModel里面的值
        $result = $this->UserModel->validate('common/User/User')->save($data);  
        // 如果validate()验证器返回的结果是false则进入if语句
        if($result === FALSE)
        {
            // 如果失败则返回UserModel的错误信息
            $this->error($this->UserModel->getError());
        }else{
            // 如果成功则弹出字体然后跳转到login.html这个视图 具体参数设置可选中success然后按f12查看
            $this->success('注册成功',url('home/index/login'));
        }
        // 输出注册页面这个视图
        return $this->fetch();
    }
    // 验证码固定语法，具体查手册  https://www.kancloud.cn/manual/thinkphp5/154295
    public function vercode()
    {
        $config = [
            'length' => 4,
            'fontSize' => 20,
            'imageW' => 150,
            'imageH' => 40
        ];
        //将$config的值作为引入到Capcha类中
        $captcha = new Captcha($config);
        // 使用Captcha中entry()方法生成图片并返回
        return $captcha->entry();
    }
}
?>




<!-- 视图 -->
<!-- 文件在application/home/view/index/login.html -->
<!-- 登录 -->
<div class="layui-container fly-marginTop">
    <div class="fly-panel fly-panel-user" pad20>
        <div class="layui-tab layui-tab-brief" lay-filter="user">
            <ul class="layui-tab-title">
                <li class="layui-this">登入</li>
                <li><a href="{:url('home/index/register')}">注册</a></li>
            </ul>
            <div class="layui-form layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
                <div class="layui-tab-item layui-show">
                    <div class="layui-form layui-form-pane">
                        <form method="post">
                            <div class="layui-form-item">
                                <label for="L_email" class="layui-form-label">邮箱</label>
                                <div class="layui-input-inline">
                                    <input type="text" id="L_email" name="email" placeholder="请输入邮箱" required lay-verify="required"
                                        autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <label for="L_pass" class="layui-form-label">密码</label>
                                <div class="layui-input-inline">
                                <input type="password" id="L_pass" name="pass" placeholder="请输入密码" required lay-verify="required"
                                        autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <label for="L_vercode" class="layui-form-label">验证码</label>
                                <div class="layui-input-inline">
                                    <input type="text" id="L_vercode" name="vercode" required lay-verify="required"
                                        placeholder="请回答后面的问题" autocomplete="off" class="layui-input">
                                </div>
                                <div class="layui-form-mid">
                                    <!-- 这里的路径是指home模块下的index控制器下的vercode方法     点击图片事件=重新刷新验证码-->  
                                <img src="{:url('home/index/vercode')}" alt="captcha" onclick="this.src = `{:url('home/index/vercode')}`" />
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <button class="layui-btn" lay-submit>立即登录</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 注册页面 -->
<div class="layui-container fly-marginTop">
    <div class="fly-panel fly-panel-user" pad20>
        <div class="layui-tab layui-tab-brief" lay-filter="user">
            <ul class="layui-tab-title">
                <li><a href="{:url('home/index/login')}">登入</a></li>
                <li class="layui-this">注册</li>
            </ul>
            <div class="layui-form layui-tab-content" id="LAY_ucm" style="padding: 20px 0;">
                <div class="layui-tab-item layui-show">
                    <div class="layui-form layui-form-pane">
                        <form method="post">
                            <div class="layui-form-item">
                                <label for="L_email" class="layui-form-label">邮箱</label>
                                <div class="layui-input-inline">
                                    <input type="text" id="L_email" name="email" placeholder="请输入邮箱" required lay-verify="email"
                                        autocomplete="off" class="layui-input">
                                </div>
                                <div class="layui-form-mid layui-word-aux">将会成为您唯一的登入名</div>
                            </div>
                            <div class="layui-form-item">
                                <label for="L_username" class="layui-form-label">昵称</label>
                                <div class="layui-input-inline">
                                    <input type="text" id="L_username" name="nickname" placeholder="请输入昵称" required lay-verify="required"
                                        autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <label for="L_pass" class="layui-form-label">密码</label>
                                <div class="layui-input-inline">
                                    <input type="password" id="L_pass" name="pass" placeholder="请输入密码" required lay-verify="required"
                                        autocomplete="off" class="layui-input">
                                </div>
                                <!-- <div class="layui-form-mid layui-word-aux">6到16个字符</div> -->
                            </div>
                            <div class="layui-form-item">
                                <label for="L_repass" class="layui-form-label">确认密码</label>
                                <div class="layui-input-inline">
                                    <input type="password" id="L_repass" name="repass" placeholder="请输入确认密码" required lay-verify="required"
                                        autocomplete="off" class="layui-input">
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <label for="L_vercode" class="layui-form-label">验证码</label>
                                <div class="layui-input-inline">
                                    <input type="text" id="L_vercode" name="vercode" required lay-verify="required"
                                        placeholder="请回答后面的问题" autocomplete="off" class="layui-input">
                                </div>
                                <div class="layui-form-mid">
                                    <!-- 引用验证码 -->
                                    <img src="{:url('home/index/vercode')}" alt="captcha" onclick="this.src = `{:url('home/index/vercode')}`" />
                                </div>
                            </div>
                            <div class="layui-form-item">
                                <button class="layui-btn" lay-submit>立即注册</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>



